/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package SemanticoPacote;

import compilador_full.TabelaSimbolos;

/**
 *
 * @author Larissa
 */
public class acessoStruct {



    //<acessoStruct> ::= -> <termoStruct> | . <termoStruct>
    //<termoStruct> ::= <nome> { [ ( <nome> | <numero> | <expAritmetica> ) ] }

     public void acessoStruct (TabelaSimbolos tabelasimbolos) {



     }
    // Metodo acessoStruct
   /* public boolean acessoStruct (TabelaSimbolos tabelasimbolos) {
        // então é da seguinte forma
        // <acessoStruct> ::= -> <termoStruct> | . <termoStruct>
        // onde -> ou . ja foram consumidos
        // daí vai para so termoStruct que é da seguinte forma
        // <termoStruct> ::= <nome> { [ ( <nome> | <numero> | <expAritmetica> ) ] }
        // verifica se é um identificador
        if (tabelasimbolos.getTipo().equals("identificador")) {
            // se for é da forma
            // <nome> logo consome nome
            tabelasimbolos.soConsome();
            // daí chama o método termostruct
            return termoStruct(tabelasimbolos);
        // se não for é um erro
        } else {
            // se não é um erro
            ErroTabela erro = new ErroTabela(tabelasimbolos.getLinha(), "Erro na linha " + tabelasimbolos.getLinha());
            TabelaErros.getInstance().getTabelaErros().add(erro);// Tabela de Erros ja contem o erro. Isso que será impresso na tela.
            return false; //se nao achar }
        }
     //
    }

   // método termoStruct
    public boolean termoStruct (TabelaSimbolos tabelasimbolos) {
        // faz o fecho para
        while (tabelasimbolos.getLookahead().equals("[")) {
            // logo consome [
            tabelasimbolos.soConsome();
            // então é da forma
            // <nome> [ ( <nome> | <numero> | <expAritmetica> ) ]
            // se for um identificador // e verifica também se não é uma expressão aritmética (faz a parte da fatoração em implementação)
            if (tabelasimbolos.getTipo().equals("identificador") && !tabelasimbolos.superLookahead(1).equals("operador")) {
                // logo é da seguinte forma
                // <nome> [ <nome> ]
                // então consome o <nome>
                tabelasimbolos.soConsome();
                // verifica se fechou o ]
                if (tabelasimbolos.getLookahead().equals("]")) {
                    // então consome o ]
                    // e a expressão é da seguinte forma <nome> [ <nome> ]
                    tabelasimbolos.soConsome();
                // se não retorna false porque não encontrou o ]
                } else {
                    // então é erro de fechar ]
                    ErroTabela erro = new ErroTabela(tabelasimbolos.getLinha(), "Erro na linha " + tabelasimbolos.getLinha());
                    TabelaErros.getInstance().getTabelaErros().add(erro);// Tabela de Erros ja contem o erro. Isso que será impresso na tela.
                    return false; //se nao achar }
                }
              //
            // verifica se é um número
            } else if (tabelasimbolos.getTipo().equals("numero") && !tabelasimbolos.superLookahead(1).equals("operador")) {
                // se for é da seguinte forma
                // <nome> [ <numero> ]
                // verifica se esse número é natural
                if (isNatural(tabelasimbolos.getLookahead())) {
                    // se for consome
                    tabelasimbolos.soConsome();
                    // verifica se fechou o ]
                    if (tabelasimbolos.getLookahead().equals("]")) {
                        // então consome o ]
                        // e a expressão é da seguinte forma <nome> [ <nome> ]
                        tabelasimbolos.soConsome();
                    // se não retorna false porque não encontrou o ]
                    } else {
                        // então é erro de fechar ]
                        ErroTabela erro = new ErroTabela(tabelasimbolos.getLinha(), "Erro na linha " + tabelasimbolos.getLinha());
                        TabelaErros.getInstance().getTabelaErros().add(erro);// Tabela de Erros ja contem o erro. Isso que será impresso na tela.
                        return false; //se nao achar }
                    }
                  //
                // se não é um erro de número natural atribuido a um vetor
                } else {
                    // então é erro
                    ErroTabela erro = new ErroTabela(tabelasimbolos.getLinha(), "Erro na linha " + tabelasimbolos.getLinha());
                    TabelaErros.getInstance().getTabelaErros().add(erro);// Tabela de Erros ja contem o erro. Isso que será impresso na tela.
                    return false; //se nao achar }
                }
              //
            // verifica se é uma expressão aritmética
            } else if ((tabelasimbolos.getTipo().equals("identificador") || tabelasimbolos.getTipo().equals("numero") ) && tabelasimbolos.superLookahead(1).equals("operador")) {
                // se for uma expressão aritmética é do tipo
                // <nome> [ <expAritmetica> ] isto é <nome> [ a + b ]
                // aqui é responsável por chamar o método
                //ExpressaoAritmetica.expAritmetica(tabelasimbolos);


                

                    // verifica se fechou o ]
                    if (tabelasimbolos.getLookahead().equals("]")) {
                        // então consome o ]
                        // e a expressão é da seguinte forma <nome> [ <nome> ]
                        tabelasimbolos.soConsome();
                    // se não retorna false porque não encontrou o ]
                    } else {
                        // então é erro de fechar ]
                        ErroTabela erro = new ErroTabela(tabelasimbolos.getLinha(), "Erro na linha " + tabelasimbolos.getLinha());
                        TabelaErros.getInstance().getTabelaErros().add(erro);// Tabela de Erros ja contem o erro. Isso que será impresso na tela.
                        return false; //se nao achar }
                    }
              //
            // então dentro de um [] não teve um nome um numero ou uma expressão
            } else {
                // logo é erro de [ ]
                if (tabelasimbolos.getLookahead().equals("]")) {
                    // consome o ] e define como erro
                    tabelasimbolos.soConsome();
                    // retorna erro
                    ErroTabela erro = new ErroTabela(tabelasimbolos.getLinha(), "Erro na linha " + tabelasimbolos.getLinha());
                    TabelaErros.getInstance().getTabelaErros().add(erro);// Tabela de Erros ja contem o erro. Isso que será impresso na tela.
                    return false; //se nao achar }
                } else {
                    // erro de não encontrar o ]
                    ErroTabela erro = new ErroTabela(tabelasimbolos.getLinha(), "Erro na linha " + tabelasimbolos.getLinha());
                    TabelaErros.getInstance().getTabelaErros().add(erro);// Tabela de Erros ja contem o erro. Isso que será impresso na tela.
                    return false; //se nao achar }
                }
            }
         //
        }
        // verifica o fecho caso não tenha [ ]
        return true;
      //
    }
    //

    
    // verifica se o número é natural - bos para o caso onde não pode ser usados numeros negativos nem fracionários em vetores.
    public boolean isNatural (String numero) {
        for (int i = 0; i < numero.length(); i++)
            if (numero.charAt(i) == '.' || numero.charAt(i) == '-')
                return false;
       // retornar
       return true;
    }*/

}
